/**
 * Excel 导入导出工具
 * 使用xlsx库实现Excel文件的读写
 */
import FileSaver from 'file-saver'
import * as XLSX from 'xlsx'

/**
 * 导出Excel文件
 * json: 要导出的数据
 * filename: 文件名
 * header: 表头
 * merges: 合并单元格
 */
export function exportJsonToExcel({
  json = [],
  filename = 'excel-list',
  header = [],
  merges = []
} = {}) {
  // 创建工作簿
  const wb = XLSX.utils.book_new()
  
  // 如果没有数据，返回空数组
  if (!json || json.length === 0) {
    return []
  }
  
  // 处理表头
  let data = []
  if (header && header.length > 0) {
    data.push(header)
  }
  
  // 处理数据
  json.forEach(item => {
    const row = []
    header.forEach(key => {
      row.push(item[key] || '')
    })
    data.push(row)
  })
  
  // 创建工作表
  const ws = XLSX.utils.aoa_to_sheet(data)
  
  // 处理合并单元格
  if (merges && merges.length > 0) {
    if (!ws['!merges']) {
      ws['!merges'] = []
    }
    merges.forEach(item => {
      ws['!merges'].push(XLSX.utils.decode_range(item))
    })
  }
  
  // 设置列宽
  const colWidth = data.map(row => row.map(val => {
    if (val == null) {
      return { wch: 10 }
    } else if (val.toString().charCodeAt(0) > 255) {
      // 中文字符
      return { wch: val.toString().length * 2 }
    } else {
      return { wch: val.toString().length }
    }
  }))
  
  // 以第一行为初始值
  const result = colWidth[0]
  for (let i = 1; i < colWidth.length; i++) {
    for (let j = 0; j < colWidth[i].length; j++) {
      if (result[j].wch < colWidth[i][j].wch) {
        result[j].wch = colWidth[i][j].wch
      }
    }
  }
  ws['!cols'] = result
  
  // 添加工作表到工作簿
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
  
  // 导出文件
  const wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'array' })
  try {
    FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), `${filename}.xlsx`)
  } catch (e) {
    console.error(e)
  }
  
  return true
}

/**
 * 从Excel文件导入数据
 * file: Excel文件
 * callback: 回调函数
 */
export function importExcel(file, callback) {
  const reader = new FileReader()
  
  reader.onload = e => {
    const data = e.target.result
    const wb = XLSX.read(data, { type: 'array' })
    const wsname = wb.SheetNames[0]
    const ws = wb.Sheets[wsname]
    const json = XLSX.utils.sheet_to_json(ws)
    
    callback(json)
  }
  
  reader.readAsArrayBuffer(file)
}

/**
 * 将表格数据导出为Excel文件
 * tableData: 表格数据
 * columns: 列配置
 * filename: 文件名
 */
export function exportTableToExcel(tableData, columns, filename = 'table') {
  const header = columns.map(col => col.label)
  const keys = columns.map(col => col.prop)
  
  const data = tableData.map(row => {
    const newRow = {}
    keys.forEach((key, index) => {
      newRow[header[index]] = row[key]
    })
    return newRow
  })
  
  exportJsonToExcel({
    json: data,
    filename,
    header
  })
}

/**
 * 检查是否支持xlsx库
 * 返回是否支持
 */
export function isXlsxSupported() {
  return true; // 现在我们已经安装了xlsx库
} 